package matheus.tp01cg.objetosdedesenho;

import android.graphics.Bitmap;
import android.util.Log;

public final class RetaBresenham extends Reta {

	public RetaBresenham(Coords pontoInicial, Coords pontoFinal, int cor) {
		super(pontoInicial, pontoFinal, cor);
	}

	/**
	 * Implementacao do algoritmo Bresenham para desenho de reta
	 */
	@Override
	public void desenha(Bitmap bitmap) {
		if (!nula) { // a reta pode ter sido anulado pelo algoritmo de recorte
			int x1 = getPontoInicial().x;
			int y1 = getPontoInicial().y;
			int x2 = getPontoFinal().x;
			int y2 = getPontoFinal().y;
			int dx, dy, x, y, const1, const2, p, xIncr, yIncr;
			dx = x2 - x1;
			dy = y2 - y1;
			if (dx >= 0) {
				xIncr = 1;
			} else {
				xIncr = -1;
				dx *= -1;
			}
			if (dy >= 0) {
				yIncr = 1;
			} else {
				yIncr = -1;
				dy *= -1;
			}
			x = x1;
			y = y1;
			synchronized (bitmap) {
				if (dy < dx) {
					p = 2 * dy - dx;
					const1 = 2 * dy;
					const2 = 2 * (dy - dx);
					for (int i = 0; i < dx; i++) {
						x += xIncr;
						if (p < 0) {
							p += const1;
						} else {
							y += yIncr;
							p += const2;
						}
						try {
							// bitmap.setPixel(x, y, getCorContorno());
							bitmapSetPonto(bitmap, x, y, corContorno,
									espessuraBorda);
						} catch (Exception e) {
							Log.d(null, "Excecao lancada em "
									+ getClass().toString()
									+ ".desenha() por bitmap.setPixel()", e);
						}
					}
				} else {
					p = 2 * dx - dy;
					const1 = 2 * dx;
					const2 = 2 * (dx - dy);
					for (int i = 0; i < dy; i++) {
						y += yIncr;
						if (p < 0) {
							p += const1;
						} else {
							x += xIncr;
							p += const2;
						}
						try {
							// bitmap.setPixel(x, y, getCorContorno());
							bitmapSetPonto(bitmap, x, y, corContorno,
									espessuraBorda);
						} catch (Exception e) {
							Log.d(null, "Excecao lancada em "
									+ getClass().toString()
									+ ".desenha() por bitmap.setPixel()", e);
						}
					}
				}
			}
		}
	}

	@Override
	public Object clone() throws CloneNotSupportedException {
		return (Object) (new RetaBresenham((Coords) getPontoInicial().clone(),
				(Coords) getPontoFinal().clone(), getCorContorno()));
	}
}
